package neu.soft.config;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import neu.soft.constant.BaseEnum;
import org.springframework.core.convert.converter.Converter;

import java.util.HashMap;
import java.util.Map;

//这俩工具类实际上没有起作用orz
public class StringToEnumConverter<T extends BaseEnum> implements Converter<String, BaseEnum> {
    /*
因为我加了write_numbers_as_strings配置，所有数值类型全都转换成了string
spring:
  jackson:
    generator:
      write_numbers_as_strings: true
所以这里写的转换器是String->Enum
*/


        private final Map<String, T> enumMap = new HashMap<>();
        private Map<String, T> nameEnumMap = new HashMap<>();
        /**
         * @描述 StringToEnumConverter构造函数，起到缓存的作用，先把对应的code->enum映射关系缓存起来，匹配到了直接获取
         */
        public StringToEnumConverter(Class<T> enumType) {
            //把所有枚举对象读取出来
            T[] enums = enumType.getEnumConstants();
            for (T e : enums) {
                //枚举对象的code作为key，枚举对象作为value
                enumMap.put(String.valueOf(e.getCode()) , e);
                nameEnumMap.put(e.getValue(), e);
            }
        }

        /**
         * @描述 code->enum 核心代码
         */
        @Override
        public T convert(String source) {
            if (StrUtil.isEmpty(source)) {
                return null;
            }
            T t = enumMap.get(source);
            // 如果code->enum的缓存中无法获取，那么尝试从name->enum的缓存中获取
            if (ObjectUtil.isNull(t)) {
                t = nameEnumMap.get(source);
                if (ObjectUtil.isNull(source)) {
                    throw new IllegalArgumentException("无法匹配对应的枚举类型");
                }
            }
            return t;

        }



}
